package masterclient;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

/**
 * In deze klasse wordt de GUI aangemaakt voor de weergave
 * @author Erik Uitenbroek, Michael Stevens
 * @since 28-05-2012
 */
public class GUI extends JFrame implements ActionListener{
    
    private Masterclient mc;
    
    //Variabelen van de tabs
    private JTabbedPane tabbedPane;
    private JPanel tabLogin;
    private JPanel tabQuery;
    private JPanel tabAccount;
    private JPanel tabBackup;
    private JPanel tabHelp;
    
    //Attributen van het log in tab
    private JLabel labelLogin = new JLabel("Log in");
    private JLabel labelUsername = new JLabel("Username:");
    private JLabel labelPassword = new JLabel("Password:");
    private JTextField fieldUsername;
    private JPasswordField fieldPassword;
    private JButton buttonLogin = new JButton("Log in");
    
    //Attributen van het Query Management tab
    private JLabel labelQuery = new JLabel("Query management");
    private JLabel labelSelectQ = new JLabel("Select query");
    private JButton buttonCreateQ = new JButton("Create new query");
    private JButton buttonActivate = new JButton("Activate/Deactivate");
    private JButton buttonDeleteQ = new JButton("Delete");
    DialoogQueryCreate queryCreate = new DialoogQueryCreate();
    
    //Attributen van het Account Management tab
    private JLabel labelAccount = new JLabel("Account management");
    private JLabel labelSelectA = new JLabel("Select account:");
    private JButton buttonCreateA = new JButton("Create new account");
    private JButton buttonEdit = new JButton("Edit");
    private JButton buttonDeleteA = new JButton("Delete");
    DialoogAccountEdit accountEdit;
    DialoogAccountCreate accountCreate;
    
    private JComboBox jCombo;
    
    //Attributen van het Back-up management
    private JLabel labelBackup = new JLabel("Back-up management");
    private JLabel labelSelectB = new JLabel("Select back-up");
    private JButton buttonCreateB = new JButton("Create new back-up");
    private JButton buttonLoad = new JButton("Load");
    private JButton buttonDeleteB = new JButton("Delete");
    
    //Attributen van het help tab
    private JLabel labelHelp = new JLabel("Help");
    private JTextArea fieldHelp = new JTextArea();
    
    //Constructor
    public GUI(Masterclient mc){
        this.mc = mc;
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Standaard schermgegevens aanmaken
        setTitle("Masterclient");
        setSize(640, 480);
        setBackground(Color.WHITE);
        setResizable(false);
        
        //Dit zorgt ervoor dat de juiste Tab (de tab waarop geklikt is) wordt weergeven
        JPanel topPanel = new JPanel();
        topPanel.setLayout(new BorderLayout());
        getContentPane().add(topPanel);        
        
        //Het aanroepen van de functies die de tabs aanmaken (in deze functies is het "subscherm" opgebouwd
        createLoginTab();
        createQueryTab();
        createAccountTab();
        createBackupTab();
        createHelpTab();
       
        //De tabbladbar aanmaken
        tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Log in", tabLogin);
        tabbedPane.addTab("Query management", tabQuery);
        tabbedPane.addTab("Account management", tabAccount);
        tabbedPane.addTab("Back-up management", tabBackup);
        tabbedPane.addTab("Help", tabHelp);
        topPanel.add(tabbedPane, BorderLayout.CENTER);
        
        //Toevoegen van de ActionListeners
        buttonCreateA.addActionListener(this);
        buttonCreateQ.addActionListener(this);
        buttonEdit.addActionListener(this);
        buttonLogin.addActionListener(this);
        buttonDeleteA.addActionListener(this);
    }

    /**
    * Methode om het login tab aan te maken
    * @author Erik uitenbroek
    * @since 28-05-2011
    */
    public void createLoginTab(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabLogin = new JPanel();
        tabLogin.setLayout(null);
        
        //Label van log in scherm wordt hier toegevoegd
        labelLogin.setBounds(10, 10, 160, 20);
        tabLogin.add(labelLogin);
        
        //Label van username textfield wordt hier toegevoegd
        labelUsername.setBounds(10, 40, 65, 20);
        tabLogin.add(labelUsername);
        
        //Label van password textfield wordt hier toegevoegd
        labelPassword.setBounds(10, 70, 65, 20);
        tabLogin.add(labelPassword);
        
        //Hier wordt het textfield van de username toegevoegd
        fieldUsername = new JTextField(5);
        getFieldUsername().setBounds(80, 40, 100, 20);
        tabLogin.add(getFieldUsername());
        
        //Hier wordt het textfield van het password toegevoegd
        fieldPassword = new JPasswordField(5);
        getFieldPassword().setBounds(80, 70, 100, 20);
        tabLogin.add(getFieldPassword());
        
        //Log in knop wordt hier toegevoegd
        buttonLogin.setBounds(10,100,160,30);
        tabLogin.add(buttonLogin);
    }
    
    /**
    * Methode om het query beheer tab aan te maken
    * @author Erik uitenbroek
    * @since 28-05-2011
    */
    public void createQueryTab() {
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabQuery = new JPanel();
        tabQuery.setLayout(null);
        
        //Label van Query Management scherm wordt hier toegevoegd
        labelQuery.setBounds(10, 10, 160, 20);
        tabQuery.add(labelQuery);
        
        //Button create new query toevoegen
        buttonCreateQ.setBounds(400,30,160,20);
        tabQuery.add(buttonCreateQ);
        
        //Label select wordt hier toegevoegd
        labelSelectQ.setBounds(10, 60, 75, 20);
        tabQuery.add(labelSelectQ);
        
        //Hier wordt het dropdown menu toegevoegd
        //dropdownmenu.setBounds(145, 60, 100, 20);
        //tabQuery.add(dropdownmenu);
        
        //Hier wordt de button Activate/deactivate toegevoegd
        buttonActivate.setBounds(10, 150, 150, 20);
        tabQuery.add(buttonActivate);
        
        //Hier wordt de delete button toegevoegd
        buttonDeleteQ.setBounds(170, 150, 75, 20);
        tabQuery.add(buttonDeleteQ);
    }
    
    /**
    * Methode om het account beheer tab aan te maken
    * @author Erik uitenbroek
    * @since 28-05-2011
    */
    public void createAccountTab() {
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabAccount = new JPanel();
        tabAccount.setLayout(null);
        
        //Label van Account Management scherm wordt hier toegevoegd
        labelAccount.setBounds(10, 10, 160, 20);
        tabAccount.add(labelAccount);
        
        //Button create new account toevoegen
        buttonCreateA.setBounds(400,30,160,20);
        tabAccount.add(buttonCreateA);
        
        //Label select wordt hier toegevoegd
        labelSelectA.setBounds(10, 60, 90, 20);
        tabAccount.add(labelSelectA);
        
        //Hier wordt het dropdown menu toegevoegd
        //dropdownmenu.setBounds(150, 60, 100, 20);
        //tabAccount.add(dropdownmenu);
        
        //Hier wordt de button edit toegevoegd
        buttonEdit.setBounds(10, 150, 150, 20);
        tabAccount.add(buttonEdit);
        
        //Hier wordt de delete button toegevoegd
        buttonDeleteA.setBounds(170, 150, 75, 20);
        tabAccount.add(buttonDeleteA);
    }
    
    /**
    * Methode om het backup beheer tab aan te maken
    * @author Erik uitenbroek
    * @since 28-05-2011
    */
    public void createBackupTab() {
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabBackup = new JPanel();
        tabBackup.setLayout(null);
        
        //Label van Bacup Management scherm wordt hier toegevoegd
        labelBackup.setBounds(10, 10, 160, 20);
        tabBackup.add(labelBackup);
        
        //Button create new backup toevoegen
        buttonCreateB.setBounds(400,30,160,20);
        tabBackup.add(buttonCreateB);
        
        //Label select wordt hier toegevoegd
        labelSelectB.setBounds(10, 60, 85, 20);
        tabBackup.add(labelSelectB);
        
        //Hier wordt het dropdown menu toegevoegd
        //dropdownmenu.setBounds(150, 60, 100, 20);
        //tabBackup.add(dropdownmenu);
        
        //Hier wordt de button load toegevoegd
        buttonLoad.setBounds(10, 150, 150, 20);
        tabBackup.add(buttonLoad);
        
        //Hier wordt de delete button toegevoegd
        buttonDeleteB.setBounds(170, 150, 75, 20);
        tabBackup.add(buttonDeleteB);
    }

    /**
    * Methode om het help tab aan te maken
    * @author Erik uitenbroek
    * @since 28-05-2011
    */
    public void createHelpTab(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabHelp = new JPanel();
        tabHelp.setLayout(null);
                
        //Toevoegen van de help label
        labelHelp.setBounds(10, 10, 160, 20);
        tabHelp.add(labelHelp);
        
        //Hier wordt de textarea aangemaakt, dit is voor de properties
        fieldHelp.setEditable(false);
        fieldHelp.setText("Hier komt de help tekst te staan, deze tekst wordt automatisch afgebroken en de scrollbar functioneert ook automatisch");
        fieldHelp.setLineWrap(true);
        fieldHelp.setWrapStyleWord(true);
        fieldHelp.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); //border wordt aangemaakt voor de scrollbar
        
        //Hier wordt de scrollbar aangemaakt, het textfield wordt aan de scrollbar toegevoegd en daarna wordt deze aangemaakt
        JScrollPane scrollBar = new JScrollPane(fieldHelp);
        scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollBar.setBounds(10, 35, 450, 375);
        tabHelp.add(scrollBar);
    }
    
    //Methodes voor login tab
    /**
     * @return the fieldUsername
     */
    public JTextField getFieldUsername() {
        return fieldUsername;
    }

    /**
     * @return the fieldPassword
     */
    public JPasswordField getFieldPassword() {
        return fieldPassword;
    }
    
    //Voor ActionListeners
    @Override
    public void actionPerformed(ActionEvent a) {
        if(a.getSource().equals(buttonCreateA)){
            accountCreate = new DialoogAccountCreate(mc);
            accountCreate.setVisible(true);
        }else if(a.getSource().equals(buttonCreateQ)){
            queryCreate.setVisible(true);
        }else if(a.getSource().equals(buttonEdit)){
            accountEdit = new DialoogAccountEdit(mc, jCombo.getSelectedIndex());
            accountEdit.setVisible(true);
        }else if(a.getSource().equals(buttonLogin)){
            mc.getUser().getUsers();
        }else if(a.getSource().equals(buttonDeleteA)){
            int n = JOptionPane.showConfirmDialog(this,"Are you sure you want to delete user: " + mc.getUser().getData()[jCombo.getSelectedIndex()][1].toString() + " ?",
                    "User deletion", JOptionPane.YES_NO_OPTION);
            if(n == 0){
                mc.getUser().deleteUser(jCombo.getSelectedIndex());
            }            
        }
    }
    
    /**
    * Methode om een dropdown list aan te maken
    * @author Michael Stevens
    * @since 19-05-2011
    */
    public void createCombolist(String[] s){
        jCombo = new JComboBox(s);        
        jCombo.setBounds(105, 60, 150, 20);
        tabAccount.add(jCombo);
        tabAccount.revalidate();
    }
    
    /**
    * Methode om een de dropdown list te verwijderen  
    * @author Michael Stevens
    * @since 19-05-2011
    */
    public void resetComboList(){
        tabAccount.remove(jCombo);
        tabAccount.revalidate();
    }
}
